package io.scnb.lesson002.demo1;

import org.junit.Test;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;

public class Demo1Test {
    
    @Test
    public void test1() {
        // 指定class
        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(Car.class.getName());
        // 获取BeanDefinition
        AbstractBeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();
        System.out.println(beanDefinition);
    }
    
    @Test
    public void test2() {
        // 指定class
        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(Car.class.getName());
        // 设置普通类型属性，给Car中的name属性赋值
        beanDefinitionBuilder.addPropertyValue("name", "奥迪");
        // 获取BeanDefinition
        AbstractBeanDefinition carBeanDefinition = beanDefinitionBuilder.getBeanDefinition();
        System.out.println(carBeanDefinition);
        
        // 创建spring容器
        DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
        // 调用registerBeanDefinition向容器中注册bean，bean的名称为car
        factory.registerBeanDefinition("car", carBeanDefinition);
        // 从容器中获取这个bean
        Car car = factory.getBean("car", Car.class);
        System.out.println(car);
    }
    
    @Test
    public void test3() {
        // 先创建car这个BeanDefinition
        AbstractBeanDefinition carBeanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Car.class.getName())
                .addPropertyValue("name", "奥迪").getBeanDefinition();
        // 创建user这个BeanDefinition
        AbstractBeanDefinition userBeanDefinition = BeanDefinitionBuilder.rootBeanDefinition(User.class.getName())
                .addPropertyValue("name", "scnb")
                // 这里需要使用addPropertyReference方法注入依赖，第一个参数为属性的名称，第二个参数为bean的名称
                .addPropertyReference("car", "car")
                .getBeanDefinition();
        
        // 创建spring容器
        DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
        factory.registerBeanDefinition("car", carBeanDefinition);
        factory.registerBeanDefinition("user", userBeanDefinition);
        System.out.println(factory.getBean("car"));
        System.out.println(factory.getBean("user"));
    }
}
